package com.yunxin.core.application.service;

import com.yunxin.common.result.PageResult;
import com.yunxin.core.application.command.product.AdvanceChargePageCommand;
import com.yunxin.core.application.command.product.ProductAdvanceChargeRecordPageCommand;
import com.yunxin.core.application.command.product.ProductPageCommand;
import com.yunxin.core.application.dto.product.*;
import com.yunxin.core.domain.external.product.ProductBanDetails;
import com.yunxin.core.infra.persistence.entity.product.ProductInfoDO;

import java.util.List;
import java.util.Set;

/**
 * @author zero°
 * @since 2023-07-13
 */
public interface ProductQueryAdminService {

    /**
     * 获取产品推广信息
     * @param productId productId
     * @return  ProductPromotionInfoDTO
     */
    ProductPromotionInfoDTO getProductPromotionInfo(Long productId);


    /**
     * 获取产品客户配置
     * @param productId productId
     * @return  ProductCustomConfigDTO
     */
    ProductCustomConfigDTO getProductPromotionCustomConfig(Long productId);

    /**
     * 获取产品投放配置
     * @param productId productId
     * @return  Result<ProductPromotionThrowInConfigResponse>
     */
    ProductThrowInConfigDTO getProductPromotionThrowInConfig(Long productId);

    /**
     * 获取产品单价配置
     * @param productId productId
     * @return  ProductUnitPriceConfigDTO
     */
    ProductUnitPriceConfigDTO geProductPromotionUnitPriceConfig(Long productId);

    /**
     * 分页查询产品列表
     * @param command command
     * @return ProductPageDTO
     */
    PageResult<ProductPageDTO> productPageQuery(ProductPageCommand command);

    /**
     * 根据商户id获取产品列表
     * @param merchantId merchantId
     * @param productType productType
     * @return List<ProductDetailDTO>
     */
    List<ProductDetailDTO> listProductByMerchantId(Long merchantId, Integer productType);

    /**
     * 获取产品下拉列表-已上架
     * @return  List<ProductListDTO>
     */
    List<ProductListDTO> listProduct();

    /**
     * 查询产品结算单价列表
     * @param productId productId
     * @return List<ProductChargedListDTO>
     */
    List<ProductChargedListDTO> listProductCharged(Long productId);

    /**
     * 根据产品id集合查询产品结算单价
     * @param productIds productIds
     * @return ProductChargedListDTO
     */
    List<ProductChargedInfoDTO> listProductCharged(Set<Long> productIds);

    /**
     * 根据id获取产品预付款详情
     * @param id id
     * @return ProductAdvanceChargeRecordDetailDTO
     */
    ProductAdvanceChargeRecordDetailDTO getProductAdvanceChargeRecordDetail(Long id);


    /**
     * 分页查询产品预付款记录列表
     * @param command command
     * @return ProductAdvanceChargeRecordPageDTO
     */
    PageResult<ProductAdvanceChargeRecordPageDTO> productAdvanceChargeRecordPageQuery(ProductAdvanceChargeRecordPageCommand command);

    List<ProductInfoDO> getProductListByMerchantId(Long merchantId);

    /**
     * 查询产品预付款记录统计
     * @param command command
     * @return ProductAdvanceChargeRecordPageDTO
     */
    ProductAdvanceChargeRecordStatisticsDTO productAdvanceChargeRecordStatistics(ProductAdvanceChargeRecordPageCommand command);

    /**
     * 分页查询商户预付款列表
     * @param command command
     * @return AdvanceChargePageDTO
     */
    PageResult<AdvanceChargePageDTO> advanceChargePageQuery(AdvanceChargePageCommand command);

    List<ProductPageDTO> productPageQueryList(ProductPageCommand command);

    /**
     * 获取商户所有的产品
     * @param merchantId
     * @param productType
     * @return
     */
    List<ProductDetailDTO> listAllProductByMerchantId(Long merchantId, Integer productType);

    List<ProductListDTO> listProductNAbutment();

    List<ProductListDTO> listProductByMerchantIdAndUserId(Long merchantId, Long userId);

    List<ProductListDTO> allProducts();

    /**
     * 查询产品禁用列表
     * @param productBanDetails
     * @return
     */
    List<ProductListDTO> getAListOfBannedProducts(ProductBanDetails productBanDetails);
}
